/*     */ package com.zimbra.cs.mailclient.imap;
/*     */ 
/*     */ import com.zimbra.cs.mailclient.ParseException;
/*     */ import java.io.IOException;
/*     */ import java.util.ArrayList;
/*     */ import java.util.List;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public final class ImapResponse
/*     */ {
/*     */   private String tag;
/*  30 */   private long number = -1L;
/*     */   private Atom code;
/*     */   private CAtom ccode;
/*     */   private Object data;
/*     */   public static final String CONTINUATION = "+";
/*     */   public static final String UNTAGGED = "*";
/*     */   
/*     */   public static ImapResponse read(ImapInputStream is) throws IOException
/*     */   {
/*  39 */     ImapResponse res = new ImapResponse();
/*  40 */     res.readResponse(is);
/*  41 */     is.trace();
/*  42 */     return res;
/*     */   }
/*     */   
/*     */   private void readResponse(ImapInputStream is)
/*     */     throws IOException
/*     */   {
/*  48 */     this.tag = is.readText(' ');
/*  49 */     is.skipChar(' ');
/*  50 */     if (this.tag.equals("+")) {
/*  51 */       this.data = ResponseText.read(is);
/*  52 */     } else if (this.tag.equals("*")) {
/*  53 */       readUntagged(is);
/*  54 */     } else if (Chars.isTag(this.tag)) {
/*  55 */       readTagged(is);
/*     */     } else {
/*  57 */       throw new ParseException("Invalid response tag: " + this.tag);
/*     */     }
/*  59 */     is.skipCRLF();
/*     */   }
/*     */   
/*     */   private void readUntagged(ImapInputStream is) throws IOException {
/*  63 */     this.code = is.readAtom();
/*  64 */     this.number = this.code.getNumber();
/*  65 */     if (this.number != -1L) {
/*  66 */       is.skipChar(' ');
/*  67 */       this.code = is.readAtom();
/*     */     }
/*  69 */     this.ccode = this.code.getCAtom();
/*  70 */     switch (this.ccode) {
/*     */     case OK: case BAD: case NO: case BYE: 
/*  72 */       is.skipChar(' ');
/*  73 */       this.data = ResponseText.read(is);
/*  74 */       break;
/*     */     case CAPABILITY: 
/*  76 */       if (is.match(' ')) {
/*  77 */         this.data = ImapCapabilities.read(is);
/*     */       } else {
/*  79 */         this.data = new ImapCapabilities();
/*     */       }
/*  81 */       break;
/*     */     
/*     */     case FLAGS: 
/*  84 */       is.skipChar(' ');
/*  85 */       this.data = Flags.read(is);
/*  86 */       break;
/*     */     
/*     */     case LIST: 
/*     */     case LSUB: 
/*     */     case XLIST: 
/*  91 */       is.skipChar(' ');
/*  92 */       this.data = ListData.read(is);
/*  93 */       break;
/*     */     case SEARCH: 
/*     */     case SORT: 
/*  96 */       this.data = readSearchData(is);
/*  97 */       break;
/*     */     
/*     */     case STATUS: 
/* 100 */       is.skipChar(' ');
/* 101 */       this.data = MailboxInfo.readStatus(is);
/* 102 */       break;
/*     */     
/*     */ 
/*     */ 
/*     */     case FETCH: 
/* 107 */       is.skipChar(' ');
/* 108 */       this.data = MessageData.read(is, this.number);
/* 109 */       break;
/*     */     case EXISTS: case RECENT: 
/*     */     case EXPUNGE: 
/*     */       break;
/*     */     case ID: 
/* 114 */       is.skipOptionalChar(' ');
/* 115 */       this.data = IDInfo.read(is);
/* 116 */       break;
/*     */     default: 
/* 118 */       throw new ParseException("Unknown response code: " + this.code);
/*     */     }
/*     */   }
/*     */   
/*     */   private List<Long> readSearchData(ImapInputStream is) throws IOException {
/* 123 */     ArrayList<Long> ids = new ArrayList();
/* 124 */     while (is.match(' ')) {
/* 125 */       is.skipSpaces();
/* 126 */       if (!is.isEOL()) {
/* 127 */         ids.add(Long.valueOf(is.readNZNumber()));
/*     */       }
/*     */     }
/* 130 */     return ids;
/*     */   }
/*     */   
/*     */   private void readTagged(ImapInputStream is) throws IOException {
/* 134 */     this.code = is.readAtom();
/* 135 */     is.skipChar(' ');
/* 136 */     this.ccode = this.code.getCAtom();
/* 137 */     switch (this.ccode) {
/*     */     case OK: case BAD: case NO: 
/* 139 */       this.data = ResponseText.read(is);
/* 140 */       break;
/*     */     default: 
/* 142 */       throw new ParseException("Invalid tagged response code: " + this.code);
/*     */     }
/*     */   }
/*     */   
/*     */   public boolean isContinuation() {
/* 147 */     return "+".equals(this.tag);
/*     */   }
/*     */   
/*     */   public boolean isUntagged() {
/* 151 */     return "*".equals(this.tag);
/*     */   }
/*     */   
/*     */   public boolean isTagged() {
/* 155 */     return (!isContinuation()) && (!isUntagged());
/*     */   }
/*     */   
/*     */   public String getTag() {
/* 159 */     return this.tag;
/*     */   }
/*     */   
/*     */   public long getNumber() {
/* 163 */     return this.number;
/*     */   }
/*     */   
/*     */   public Atom getCode() {
/* 167 */     return this.code;
/*     */   }
/*     */   
/*     */   public CAtom getCCode() {
/* 171 */     return this.ccode;
/*     */   }
/*     */   
/*     */   public Object getData() {
/* 175 */     return this.data;
/*     */   }
/*     */   
/* 178 */   public boolean isOK() { return this.ccode == CAtom.OK; }
/* 179 */   public boolean isBAD() { return this.ccode == CAtom.BAD; }
/* 180 */   public boolean isNO() { return this.ccode == CAtom.NO; }
/* 181 */   public boolean isBYE() { return this.ccode == CAtom.BYE; }
/*     */   
/*     */   public boolean isStatus() {
/* 184 */     switch (this.ccode) {
/*     */     case OK: case BAD: case NO: case BYE: 
/* 186 */       return true;
/*     */     }
/* 188 */     return false;
/*     */   }
/*     */   
/*     */   public boolean isWarning() {
/* 192 */     return (isNO()) && (!isTagged());
/*     */   }
/*     */   
/*     */   public boolean isError() {
/* 196 */     return (isBAD()) || ((isNO()) && (isTagged()));
/*     */   }
/*     */   
/*     */   public ResponseText getResponseText() {
/* 200 */     return (ResponseText)this.data;
/*     */   }
/*     */   
/*     */   public String getContinuation() {
/* 204 */     return isContinuation() ? getResponseText().getText() : null;
/*     */   }
/*     */   
/*     */   public void dispose() {
/* 208 */     if ((this.data instanceof MessageData)) {
/* 209 */       ((MessageData)this.data).dispose();
/*     */     }
/*     */   }
/*     */   
/*     */   public String toString()
/*     */   {
/* 215 */     StringBuilder sb = new StringBuilder(this.tag);
/* 216 */     sb.append(' ');
/* 217 */     if (this.number != -1L) sb.append(this.number).append(' ');
/* 218 */     if (this.code != null) sb.append(this.code);
/* 219 */     if (this.data != null) sb.append(" <data>");
/* 220 */     return sb.toString();
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/mailclient/imap/ImapResponse.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */